module key_debounce_lcd(
    input              lcd_clk,      //lcd模块驱动时钟
    input              sys_rst_n,    //复位信号
	 input              key_1,             //外部按键输入
    output reg       key_flag_1,         //按键数据有效信号
    output reg       key_value_1         //按键消抖后的数据  
);
//reg define    
reg [31:0] delay_cnt;
reg        key_reg;

//*****************************************************
//**                    main code
//*****************************************************
always @(posedge lcd_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 
        key_reg   <= 1'b1;
        delay_cnt <= 32'd0;
    end
    else begin
        key_reg <= key_1;
        if(key_reg != key_1)             //一旦检测到按键状态发生变化(有按键被按下或释放)
            delay_cnt <= 32'd1000000;  //给延时计数器重新装载初始值（计数时间为20ms）
        else if(key_reg == key_1) begin  //在按键状态稳定时，计数器递减，开始20ms倒计时
                 if(delay_cnt > 32'd0)
                     delay_cnt <= delay_cnt - 1'b1;
                 else
                     delay_cnt <= delay_cnt;
             end           
    end   
end

always @(posedge lcd_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 
        key_flag_1  <= 1'b0;
        key_value_1 <= 1'b1;          
    end
    else begin
        if(delay_cnt == 32'd1) begin   //当计数器递减到1时，说明按键稳定状态维持了20ms
            key_flag_1  <= 1'b1;         //此时消抖过程结束，给出一个时钟周期的标志信号
            key_value_1 <= key_1;          //并寄存此时按键的值
        end
        else begin
            key_flag_1  <= 1'b0;
            key_value_1 <= key_value_1; 
        end  
    end   
end
    
endmodule 